/**
 * FIFO一般用于不同时钟域之间的数据传输，也常用来实现不同位宽的接口的数据匹配。
 * 我方有大量数据将要发出，接收方仅处理能力较低，频率比我方低。数据位宽一样，且对方时而转向别的任务，
 * 并不总是在接受数据。 我发时钟频率50MHz，接收方时钟频率20MHz，使用数据位宽16位。
 */
module quartus_fifo_top (
    input   wire                clk_50m,
    input   wire                clk_20m,
    input   wire                rst_n,
    output  wire    [15:0]      q
);

    wire                        wrreq;
    wire                        wrempty;
    wire                        wrfull;
    wire            [15:0]      data;

    //模块A：写操作模块
    write_operate write_operate_inst (
        .clk_50m                (clk_50m),
        .rst_n                  (rst_n),
        .wrreq                  (wrreq),
        .data                   (data),
        .wrempty                (wrempty),
        .wrfull                 (wrfull)
	);
    
    //模块B：读操作模块
    wire                        rdempty;
	wire                        rdfull;
	wire                        rdreq;
	read_operate read_operate_inst (
        .clk_20m                (clk_20m),
        .rst_n                  (rst_n),
        .rdempty                (rdempty),
        .rdfull                 (rdfull),
        .rdreq                  (rdreq)
    );

	wire [7:0] wrusedw;
	wire [7:0] rdusedrw;
    fifo fifo_inst (
        .wrclk                  ( clk_50m ),            //写时钟
        .wrreq                  ( wrreq ),              //写请求
        .data                   ( data ),               //写数据
        .wrempty                ( wrempty ),            //写空
        .wrfull                 ( wrfull ),             //写满
        .wrusedw                ( wrusedw ),            //已使用

        .rdclk                  ( clk_20m ),            //读时钟
        .rdreq                  ( rdreq ),              //读请求
        .q                      ( q ),                  //读数据
        .rdempty                ( rdempty ),            //读空
        .rdfull                 ( rdfull ),             //读满
        .rdusedw                ( rdusedrw )            //已使用
    );

endmodule 